package vista;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.*;
import javax.swing.DefaultListModel;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class ElementoPaginationDTO extends Observable{
    private String txtSalida;
    private Element elementoPaginationDTO;
    private Document docPagination=null;
    private int idMayorPagination=0;
    private boolean nuevoPagination=false;
    private DefaultListModel modeloListaPagination = new DefaultListModel();  

    /**
     * @return the ElementoPaginationDTO
     */
    public Element getElementoPaginationDTO() {
        return elementoPaginationDTO;
    }

    
    /**
     * @param ElementoPaginationDTO the ElementoPaginationDTO to set
     */
    public void setElementoPaginationDTO(Element elementoPaginationDTO) {
        this.elementoPaginationDTO = elementoPaginationDTO;
    }
    
    public ElementoPaginationDTO(){
 
    }
    
    @Override
    public String toString(){
        String cad= "PaginationDTO "+this.getElementoPaginationDTO().getAttributeValue("id");
        cad+=" - "+this.getElementoPaginationDTO().getAttributeValue("descripcion");
        return cad;
    }
    
    public void vaciaCamposPagination() {
        FormDTOs a = vista.FormDTOs.getInstance();
        a.getCampoActualPage().setText("");
        a.getCampoInitLimit().setText("");
        a.getCampoRecordsTotal().setText("");
        a.getCampoRowCount().setText("");
        a.getCampoCriteria().setText("");
        a.getCampoOrder().setText("");
        a.getComentariosPagination().setText("");
    }


    public FileInputStream abreArchivoPagination(String nombre) throws JDOMException{
        //Intentamos abrir el archivo, y si no existe lo creamos
        String ruta =System.getProperty("user.dir")+"\\"+nombre+"s.xml";
        FileInputStream archivo=null;
        boolean exists = (new java.io.File(ruta)).exists(); 
        if (exists) { 
            try { archivo = new FileInputStream(ruta); }
            catch (IOException e) { System.out.println(e); 
                setTxtSalida("No se pudo abrir "+ruta); 
            }
        }
        else {
            try { java.io.File file = new java.io.File(ruta);
                  // Create file if it does not exist
                  boolean success = file.createNewFile();
                  boolean sePuedeLeer = file.canRead();
                  try { archivo = new FileInputStream(ruta); 
                        // Creamos el builder basado en SAX      
                        SAXBuilder builder = new SAXBuilder();  
                        // Construimos el arbol DOM
                        //setDocCampaign(builder.build(archivo));
                        setDocPagination(new Document());
                        // Le agregamos el root element que corresponda y lo guardamos
                        Element rootElement = new Element("Elementos"+nombre);
                        getDocPagination().addContent(rootElement);
                        guardaXMLpagination();
                        setDocPagination(null);
                  }
                  catch (IOException e) { System.out.println(e); 
                      setTxtSalida("No se pudo abrir "+ruta); 
                  }
            } catch (IOException e) {
                System.out.println(e); 
                setTxtSalida("No se pudo crear "+ruta);
            }
         }
     return archivo;   
}

    
public Element armaNuevoElementPagination() {
    Element pagDto= new Element("PaginationDTO");
    pagDto.setAttribute("id",String.valueOf(getIdMayorPagination()+1));
    pagDto.setAttribute("descripcion",vista.FormDTOs.getInstance().getComentariosPagination().getText());
    Element actualPage = new Element("actualPage").setText(vista.FormDTOs.getInstance().getCampoActualPage().getText());
    pagDto.addContent(actualPage);
    Element initLimit = new Element("initLimit").setText(vista.FormDTOs.getInstance().getCampoInitLimit().getText());
    pagDto.addContent(initLimit);

    Element orders = new Element("orders");
    Element criteria = new Element("criteria").setText(vista.FormDTOs.getInstance().getCampoCriteria().getText());
    orders.addContent(criteria);
    Element order = new Element("order").setText(vista.FormDTOs.getInstance().getCampoOrder().getText());
    orders.addContent(order);
    pagDto.addContent(orders);

    Element recordsTotal = new Element("recordsTotal").setText(vista.FormDTOs.getInstance().getCampoRecordsTotal().getText());
    pagDto.addContent(recordsTotal);
    Element rowCount = new Element("rowCount").setText(vista.FormDTOs.getInstance().getCampoRowCount().getText());
    pagDto.addContent(rowCount);  
    
    return pagDto;
}
    
public boolean actualizaValoresEnDocPagination(int idItemElegido) {
    boolean todoOk=false;
    if (!isNuevoPagination()){ 
        //si no es nuevo, es porque estoy modificando alguno de los seleccionados
        Element e = obtienePaginationElegido(idItemElegido);
        if (e != null) {
            e.setAttribute("descripcion", vista.FormDTOs.getInstance().getComentariosPagination().getText());
            e.getChild("actualPage").setText(vista.FormDTOs.getInstance().getCampoActualPage().getText());
            e.getChild("initLimit").setText(vista.FormDTOs.getInstance().getCampoInitLimit().getText());
            e.getChild("recordsTotal").setText(vista.FormDTOs.getInstance().getCampoRecordsTotal().getText());
            e.getChild("rowCount").setText(vista.FormDTOs.getInstance().getCampoRowCount().getText());        
            e.getChild("orders").getChild("order").setText(vista.FormDTOs.getInstance().getCampoOrder().getText());
            e.getChild("orders").getChild("criteria").setText(vista.FormDTOs.getInstance().getCampoCriteria().getText());
            todoOk=true;
        }
    }
    else
        { if (vista.FormDTOs.getInstance().getPagDTO().validaCamposPagination()){
               //se arma el Element que representará el nuevo ElementoPaginationDTO
               //con los valores especificados por el usuario
               Element paginationNuevo = armaNuevoElementPagination();  
               getDocPagination().getRootElement().addContent(paginationNuevo);
               todoOk=true;
            }                     
        } 
    return todoOk;
}

public boolean validaCamposPagination(){
    //validamos los noErrorPaginationDTOdatos ingresados en ElementoPaginationDTO
    boolean noErrorPaginationDTO=true;
    FormDTOs pantalla=FormDTOs.getInstance();
    noErrorPaginationDTO=pantalla.getCampoActualPage().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoActualPage().getText()) && (!(pantalla.getCampoActualPage().getText().contains("."))) && (!(pantalla.getCampoActualPage().getText().contains(",")));
    noErrorPaginationDTO=noErrorPaginationDTO && pantalla.getCampoInitLimit().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoInitLimit().getText())  && (!(pantalla.getCampoInitLimit().getText().contains("."))) && (!(pantalla.getCampoInitLimit().getText().contains(",")));
    noErrorPaginationDTO=noErrorPaginationDTO && pantalla.getCampoRecordsTotal().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoRecordsTotal().getText())  && (!(pantalla.getCampoRecordsTotal().getText().contains("."))) && (!(pantalla.getCampoRecordsTotal().getText().contains(",")));
    noErrorPaginationDTO=noErrorPaginationDTO && pantalla.getCampoRowCount().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoRowCount().getText())  && (!(pantalla.getCampoRowCount().getText().contains("."))) && (!(pantalla.getCampoRowCount().getText().contains(",")));
    noErrorPaginationDTO=noErrorPaginationDTO && pantalla.getCampoOrder().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoOrder().getText())  && (!(pantalla.getCampoOrder().getText().contains("."))) && (!(pantalla.getCampoOrder().getText().contains(",")));
    noErrorPaginationDTO=noErrorPaginationDTO && pantalla.getCampoCriteria().getText().length()>0 && pantalla.containsOnlyNumbers(pantalla.getCampoCriteria().getText())  && (!(pantalla.getCampoCriteria().getText().contains("."))) && (!(pantalla.getCampoCriteria().getText().contains(",")));
    if (!(noErrorPaginationDTO)){
        pantalla.agregaTxtAsalida("Verifique los datos especificados en PaginationDTO");
    }
    return noErrorPaginationDTO;
}


public DefaultListModel LeeXMLpagination() {
        getModeloListaPagination().clear();
    //SAXBuilder se encarga de cargar el archivo XML del disco o de un String
    // Creamos el builder basado en SAX      
    SAXBuilder builder = new SAXBuilder();  
    try {
        //abrimos el archivo
        FileInputStream archivo = abreArchivoPagination("PaginationDTO");        
        // Construimos el arbol DOM a partir del fichero xml  y Cargamos el documento
         setDocPagination(builder.build(archivo));
         // Obtenemos la etiqueta raíz  
         Element raiz = getDocPagination().getRootElement();  
         // Recorremos los hijos de la etiqueta raíz  
         List<Element> hijosRaiz = raiz.getChildren();  
         for(Element elementoPaginationDTO: hijosRaiz){  
            // Obtenemos el nombre y su contenido de tipo texto  
            String nombre = elementoPaginationDTO.getName();  
            String texto = elementoPaginationDTO.getValue();       
            //System.out.println("\n Etiqueta: "+nombre+". Texto: "+texto);

            // Obtenemos el atributo id si lo hubiera
            String id = elementoPaginationDTO.getAttributeValue("id");  
            if(id!=null){  
                if (getIdMayorPagination()<Integer.valueOf(id))
                  {     setIdMayorPagination((int) Integer.valueOf(id)); }
                id=" id: "+id;
            }
            else { id=""; }
            // Obtenemos el atributo descripcion si lo hubiera              
            String descripcion = elementoPaginationDTO.getAttributeValue("descripcion");  
            if(descripcion!=null){  
                descripcion="- Descripcion: "+descripcion;
            }
            else { descripcion=""; } 
            ElementoPaginationDTO elemPagDto = new ElementoPaginationDTO();
            elemPagDto.setElementoPaginationDTO(elementoPaginationDTO);            
            //getModeloListaPagination().addElement(nombre+id+descripcion);
            getModeloListaPagination().addElement(elemPagDto);
         }   
        }catch (JDOMException ex) {
            //1todoOk=false;
            Logger.getLogger(FormDTOs.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            //1 todoOk=false;
            Logger.getLogger(FormDTOs.class.getName()).log(Level.SEVERE, null, ex);
        }       
    return getModeloListaPagination();
}

public void guardaXMLpagination() { //quedé acá
        // Vamos a serializar el XML. Lo primero es obtener el formato de salida  
        // Partimos del "Formato bonito", aunque también existe el plano y el compacto  
        Format format = Format.getPrettyFormat();  
        // Creamos el serializador con el formato deseado  
        XMLOutputter xmloutputter = new XMLOutputter(format);  
        // Serializamos el document parseado  
        //String docStr = xmloutputter.outputString(docPagination);          
        try{
            String filename="PaginationDTOs.xml";
            FileOutputStream file = new FileOutputStream(filename);
            xmloutputter.output(getDocPagination(),file);
            file.flush();
            file.close();
            //xmloutputter.output(this.pagDTO.getDocPagination(),System.out);
            setTxtSalida("Se guardaron correctamente los cambios en el archivo "+filename);
            setNuevoPagination(false);
            vista.FormDTOs.getInstance().leeXMLsyActualizaInterfaz();
        }catch(Exception e){
            e.printStackTrace();
            setTxtSalida("No se pudieron guardar los datos en el archivo");
        }
}

public Element obtienePaginationElegido(int idItemElegido) {
    Element e=null;    
    boolean encontro=false;    
    if (idItemElegido>=0) {        
        Element raiz= getDocPagination().getRootElement();
        List<Element> lista=raiz.getChildren("PaginationDTO");
        int i=0;
        while ((i<lista.size()) && (!(encontro))){
          e = lista.get(i);
          if (e.getAttributeValue("id").equals(String.valueOf(idItemElegido)))
            { encontro=true; }
          i++;
        }
    }
    if (!(encontro)){
        e=null;
    }
    return e;
}

    /**
     * @return the docPagination
     */
    public Document getDocPagination() {
        return docPagination;
    }

    /**
     * @param docPagination the docPagination to set
     */
    public void setDocPagination(Document docPagination) {
        this.docPagination = docPagination;
    }

    /**
     * @return the idMayorPagination
     */
    public int getIdMayorPagination() {
        return idMayorPagination;
    }

    /**
     * @param idMayorPagination the idMayorPagination to set
     */
    public void setIdMayorPagination(int idMayorPagination) {
        this.idMayorPagination = idMayorPagination;
    }

    /**
     * @return the nuevoPagination
     */
    public boolean isNuevoPagination() {
        return nuevoPagination;
    }

    /**
     * @param nuevoPagination the nuevoPagination to set
     */
    public void setNuevoPagination(boolean nuevoPagination) {
        this.nuevoPagination = nuevoPagination;
    }

    /**
     * @return the modeloListaPagination
     */
    public DefaultListModel getModeloListaPagination() {
        return modeloListaPagination;
    }

    /**
     * @param modeloListaPagination the modeloListaPagination to set
     */
    public void setModeloListaPagination(DefaultListModel modeloListaPagination) {
        this.modeloListaPagination = modeloListaPagination;
    }

    /**
     * @return the txtSalida
     */
    public String getTxtSalida() {
        return txtSalida;
        //vista.FormDTOs.getInstance().getTxtSalida();
    }

    /**
     * @param txtSalida the txtSalida to set
     */
    public void setTxtSalida(String txtSalida) {
        this.txtSalida = txtSalida;
        //vista.FormDTOs.getInstance().agregaTxtAsalida(txtSalida);
        this.setChanged();
        notifyObservers();        
    }

    
}
